﻿####Parts fo server archeteture
import sys
import os
import thread 
from datetime import datetime
import time

class QueryMaster:
    nextUserId=0
    users={}
    queue={}
    querys={}
    
    def __init__(self):
        self.nextUserId=0
        print "Query Master OK!"
    def new_player(self,con,addr):
        id=self.nextUserId
        self.nextUserId+=1
        self.users[id]=[con,addr]#[0]=con,[1]=addr
        self.users[id][0].send("/id&"+str(id)+chr(0))#send his id to user
        self.queue[id]=True
        return (con,addr,id)
        
    def sender(self,id,id_query,msg,server=False):#посылает комунибудь чтонить 
        while 1:
            if self.queue[id]==True:
               self.queue[id]=False
               if server==True:
                   self.users[id][0].send("s."+str(id_query)+"/"+msg+chr(0))
               else:
                   self.users[id][0].send(str(id)+"."+str(id_query)+"/"+msg+chr(0))
               self.queue[id]=True
               break
        return id_query
    
    def send_to_all(self,msg,id,id_query):
        for user in self.users:
                self.sender(user,1,"3&"+str(self.users[id][1][0])+":"+str(self.users[id][1][1])+ " : "+msg,True)
      
    def new_qeuery(self,id,data):
            cmd=data.split("/")
            query_text=cmd[1]
            #если такой уже существует то не чего не делает
            try:
                for query in self.querys[id]:
                    if query["query_text"]==query_text:
                        print u'Запрашивается уже имеющийся в исполнени запрос'
                        return False
            except:
                self.querys[id]={}
            #если такой еще нет то пыатемся выяснить айди 
            cmd=cmd[0].split(".")
            id_query=cmd[1]  
            self.querys[id][id_query]=query_text   
            if query_text.find("&")==-1:
                cmd=query_text.split(chr(0))
                resived=cmd[0]
            else:
                cmd=query_text.split("&")
                resived=cmd[0]
                #slice chr(0)
            last=len(cmd)
            text=cmd[last-1]
            cmd[last-1]=text[:-1]
           
            return ({"id":id,"id_query":id_query,"resived":resived,"cmd":cmd})
                
    def disconected(self,id):
        del self.users[id]



class Logger:
    def __init__(self,filename):#обнуляет файл
        CURDIR = os.path.dirname(__file__)
        self.path=CURDIR+"/"+filename
        f = open(self.path, 'w')
        f.write("Server requests log:")
        f.close()
        print "Logger OK!"
    def log(self,msg,action="-"):#добавляет лог
        f = open(self.path, 'a')
        msg="\n%s %s"%(action,msg)
        f.write(msg)
        f.close()
        
        
class ProgressBar(): #прогресс бар вызвается (и сколько вобще,буковка обозначающая еденичку)
    def __init__(self, finalcount, progresschar=None):
        import sys
        self.finalcount=finalcount
        self.blockcount=0
        
        if not progresschar: self.block=chr(178)
        else:                self.block=progresschar
        
        self.f=sys.stdout
        
        if not self.finalcount : return
        self.f.write('\n------------------ % Progress --------------------\n')
        self.f.write('    10   20   30   40   50   60   70   80   90   100\n')
        self.f.write('----%----%----%----%----%----%----%----%----%-----%\n')
        return

    def progress(self, count):#и выводящая 
        count=min(count, self.finalcount)
        if self.finalcount:
            percentcomplete=int(round(100*count/self.finalcount))
            if percentcomplete < 1: percentcomplete=1
        else:
            percentcomplete=100
            
        blockcount=int(percentcomplete/2)
        
        if blockcount > self.blockcount:
            for i in range(self.blockcount,blockcount):
                self.f.write(self.block)
                self.f.flush()
                
        if percentcomplete == 100: self.f.write("\n")
        self.blockcount=blockcount
        return